/**
 * @file hello.cpp
 * @author tangjf (ryontang@163.com)
 * @brief 华为8.26笔试编程题 第一题移位计算
 * @version 0.1
 * @date 2020-09-02
 * 
 * @copyright Copyright (c) 2020
 * 
 */

// 输入一行32位的无符号整数数组，不定长，用空格分隔，要求对他们做“加密”

#include <iostream>

using namespace std;

int main()
{
  unsigned int N, a[1001], tail[1001], tmp;
  N = 0;
  while (cin >> tmp)
  {
    a[N] = tmp;
    N++;
  }

  for (int i = 0; i < N; i++)
  {
    // 0xa=1010b  0x5=0101b 操作一：每个整数，每两个bit交换位置
    a[i] = ((a[i] & 0xaaaaaaaa) >> 1) | ((a[i] & 0x55555555) << 1); // 对于a[i]的这个数，其每两个bit交换位置
    // 0x3=0011b
    tail[i] = (a[i] & 0x3) << 30;
    a[i] = a[i] >> 2;
  }

  for (int i = 0; i < N; i++)
  {
    a[i] = a[i] | tail[(i - 1 + N) % N]; // tail[(i-1+N)%N] 这个数组的表示用得好
    cout << a[i] << " ";
  }

  // 另一种方法，如果凑不出i-1+N
  // 操作1
  for (unsigned int i = 0; i < N; i++)
  {
    a[i] = ((a[i] & 0xaaaaaaaa) >> 1) | ((a[i] & 0x55555555) << 1);
  }

  // 操作2
  unsigned int left = 0, now = 0;
  for (unsigned int i = 0; i < N; i++)
  {
    now = a[i] & 0x3;                  // 保留低两位
    a[i] = (a[i] >> 2) | (left << 30); // a[0]时，left=0,并没有|数据拼接，后面单独处理
    left = now;
  }
  a[0] = a[0] | (left << 30); // left此时保留最后一个数的低二位

  // 然后直接cout就行

  return 0;
}